import { _decorator, CCFloat, Component, find, game, instantiate, Node, Prefab, RigidBody2D, v2, v3, Vec2, Vec3 } from 'cc'
import { Actor } from '../Actor'
import { Projectile } from './Projectile'
const { ccclass, property } = _decorator
// 子弹发射器相关逻辑
@ccclass('SimpleEmitter')
export class SimpleEmitter extends Component {
    @property(Node)
    emitterRoot: Node | null = null
    @property(Prefab)
    projectilePrefab: Prefab = null
    @property(CCFloat)
    startLinearSpeed: number = 0
    @property(CCFloat)
    startAngularSpeed: number = 0
    actor: Actor | null = null
    canvasNode: Node = null
    @property(CCFloat)
    cooldown: number = 5; // 冷却时间
    castTime: number = 0;
    protected onLoad(): void {
        this.canvasNode = find('LevelCanvas')
    }
    start() {


    }
    // 发射子弹
    emit() {
        this.castTime = game.totalTime // 毫秒级
        // 依据发射器定义的子弹数量及发射器位置，生成子弹
        for (let i = 0; i < this.emitterRoot?.children.length; i++) {
            let emitNode = this.emitterRoot.children[i]
            if (!emitNode.active) {
                continue
            }
            //世界旋转角度
            let wr = emitNode.worldRotation
            //创建一个新的子弹实例
            let node = instantiate(this.projectilePrefab)
            // 将新创建的子弹设置为活动状态，并添加到 canvasNode 的子节点列表中
            node.active = true
            this.canvasNode.addChild(node)
            // 表示一个单位向量沿 X 轴正方向。
            let left = Vec3.UNIT_X
            // 实例来存储速度向量。
            let velocityV3 = v3()
            // Vec3.transformQuat 方法将单位向量沿 emitNode 的旋转方向变换，得到子弹的初始速度方向。
            Vec3.transformQuat(velocityV3, left, wr)
            // 获取子弹刚体组件
            let rigid = node.getComponent(RigidBody2D)
            // 创建一个 Vec2 实例来存储子弹的速度 根据变换后的速度方向，设置子弹的速度，
            let velocity: Vec2 = v2(velocityV3.x, velocityV3.y)
            // velocity.x = velocityV3.x
            // velocity.y = velocityV3.y
            // 并乘以 startLinearSpeed 来调整速度大小。
            velocity.multiplyScalar(this.startLinearSpeed)
            // 设置刚体组件的线性速度 / 角速度
            rigid.linearVelocity = velocity
            rigid.angularVelocity = this.startAngularSpeed
            // 设置子弹的世界位置为发射器的位置。
            node.worldPosition = emitNode.worldPosition
            // 通过 node 获取子弹的 Projectile 组件，
            let projectile = node.getComponent(Projectile)
            // 并设置其 host 属性为发射子弹的角色(actor)
            node.getComponent(Projectile).host = this.actor

        }
    }
    get isCoolingdown() {
        return game.totalTime - this.castTime > this.cooldown * 1000
    }
}
